The values returned in a structure of type frs_overrun_info_t are the counts of overrun and underrun exceptions incurred by that process in that minor frame. In order to find out the count of all overruns in a given minor frame, you must sum the counts for all processes queued to that frame. If a process is queued to more than one minor frame, separate counts are kept for it in each frame.
The function in Example 7-5 takes a Frame Scheduler handle and a minor frame number. It gets the list of process IDs queued to that that minor frame, and returns the sum of all exceptions for all of them.
Example 7-5 : Function to Return a Sum of Exception Counts
#define THE_MOST_PIDS 250 int totalExcepts(frs_t * theFRS, int theMinor) { int numPids = frs_getqueuelen(theFRS, theMinor); int j, sum; pid_t allPids[THE_MOST_PIDS]; if ( (numPids <= 0) || (numPids > THE_MOST_PIDS) ) return 0; /* invalid minor #, or no procs queued? */ if (!frs_readqueue(theFRS, theMinor, allPids)) return 0; /* unexpected problem with reading IDs */ for (sum = j = 0; j<numPids; ++j) { frs_overrun_info_t work; frs_getattr(theFRS, /* the scheduler */ theMinor, /* the minor frame */ allPids[j], /* the process */ FRS_ATTR_OVERRUNS, /* want counts */ &work); /* put them here */ sum += (work.overruns + work.underruns); } return sum; }
Tip: If a function such as the one in Example 7-5 is to be called frequently, it is a good idea to prepare the arrays of process IDs once and save them. The repeated calls to frs_getqueuelen() and frs_readqueue() can be avoided.